﻿using System;

namespace Fennec
{

    public class UnitéEtudiant : Unité
    {
        public UnitéEtudiant(System.Drawing.Point pos) : base(pos) { }

        public override bool peutAttaquer()
        { return true; }

        public override void attaquer(Unité cible)
        {
            if (this.position != cible.position)
            {
                string m = "Attaque impossible : les deux unités ne sont pas sur la même case\n";
                m += "Attaquant : " + this.ToString() + "\n";
                m += "Attaqué   : " + cible.ToString();
                throw new ActionImpossibleException(m);
            }
            else if (cible.défense == 0)
            {
                cible.tuer();
                return;
            }

            Random random0 = new Random();
            int tours_restants = random0.Next(3, Math.Max(vie, cible.vie) + 2);
            double atq_subit_degat;
            int degat;

            LogManager.WriteLine("Le combat durera " + tours_restants + " tour(s) au maximum.");
            while (tours_restants-- > 0 && cible.vie > 0 && this.vie > 0)
            {
                /* probabilité que l'attaquant subisse un dégat */
                if (this.attaque > cible.défense)
                {
                    atq_subit_degat = cible.défense / this.attaque - 1;
                }
                else if (this.attaque == cible.défense)
                {
                    atq_subit_degat = 0;
                }
                else
                {
                    atq_subit_degat = 1 - this.attaque / cible.défense;
                }
                atq_subit_degat = (1 + atq_subit_degat) / 2;

                LogManager.Write("Tour : ");
                /* l'attaquant est endommagé */
                if (random0.NextDouble() < atq_subit_degat)
                {
                    degat = (int)((cible.attaque * cible.vie) / cible.vie_base);
                    this.endommager(degat);

                    LogManager.WriteLine("l'attaquant perd " + degat + " points de vie.");
                }
                else
                {
                    /* le défenseur est endommagé */
                    degat = (int)((this.attaque * this.vie) / this.vie_base);
                    cible.endommager(degat);

                    LogManager.WriteLine("l'attaqué perd " + degat + " points de vie.");
                }
            } // while

            if (cible.vie <= 0)
            {
                LogManager.WriteLine("L'attaqué a perdu le combat.");
            }
            else if (this.vie <= 0)
            {
                LogManager.WriteLine("L'attaquant a perdu le combat.");
            }
            else
            {
                LogManager.WriteLine("Personne n'est mort.");
            }
        }
    }

}
